package cn.iocoder.yudao.module.system.dal.mysql.gugu;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.gugu.CollegeRecommendationDO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 高校推荐结果 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface CollegeRecommendationMapper extends BaseMapperX<CollegeRecommendationDO> {

    /**
     * 根据用户ID查询推荐记录
     *
     * @param userId 用户ID
     * @return 推荐记录列表
     */
    default List<CollegeRecommendationDO> selectByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId)
                .orderByDesc(CollegeRecommendationDO::getRecommendationTime));
    }

    /**
     * 根据用户ID和推荐类型查询推荐记录
     *
     * @param userId 用户ID
     * @param recommendationType 推荐类型
     * @return 推荐记录列表
     */
    default List<CollegeRecommendationDO> selectByUserIdAndType(Long userId, String recommendationType) {
        return selectList(new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId)
                .eq(CollegeRecommendationDO::getRecommendationType, recommendationType)
                .orderByDesc(CollegeRecommendationDO::getAdmissionProbability));
    }

    /**
     * 根据用户ID和时间范围查询推荐记录
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 推荐记录列表
     */
    default List<CollegeRecommendationDO> selectByUserIdAndTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        return selectList(new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId)
                .between(CollegeRecommendationDO::getRecommendationTime, startTime, endTime)
                .orderByDesc(CollegeRecommendationDO::getRecommendationTime));
    }

    /**
     * 检查是否存在相同的推荐记录
     *
     * @param userId 用户ID
     * @param schoolUuid 学校UUID
     * @param majorName 专业名称
     * @param userScore 用户分数
     * @param userRank 用户位次
     * @return 是否存在
     */
    default boolean existsSameRecommendation(Long userId, String schoolUuid, String majorName, Integer userScore, Integer userRank) {
        return selectCount(new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId)
                .eq(CollegeRecommendationDO::getSchoolUuid, schoolUuid)
                .eq(CollegeRecommendationDO::getMajorName, majorName)
                .eq(CollegeRecommendationDO::getUserScore, userScore)
                .eq(CollegeRecommendationDO::getUserRank, userRank)) > 0;
    }

    /**
     * 删除用户的历史推荐记录（保留最近N条）
     *
     * @param userId 用户ID
     * @param keepCount 保留数量
     */
    default void deleteOldRecommendations(Long userId, int keepCount) {
        // 这里需要使用原生SQL实现，因为MyBatis Plus不支持复杂的删除操作
        // 实际实现时可以通过自定义SQL或者先查询再删除的方式
    }

    /**
     * 统计用户推荐记录数量
     *
     * @param userId 用户ID
     * @return 记录数量
     */
    default long countByUserId(Long userId) {
        return selectCount(new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId));
    }

    /**
     * 分页查询推荐记录
     *
     * @param userId 用户ID
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    default PageResult<CollegeRecommendationDO> selectPage(Long userId, Integer pageNo, Integer pageSize) {
        PageParam pageParam = new PageParam();
        pageParam.setPageNo(pageNo);
        pageParam.setPageSize(pageSize);
        return selectPage(pageParam, new LambdaQueryWrapperX<CollegeRecommendationDO>()
                .eq(CollegeRecommendationDO::getUserId, userId)
                .orderByDesc(CollegeRecommendationDO::getRecommendationTime));
    }
}
